package com.warm.base.design.s_flyweight;

/**
 * @Date: 2019/11/22 13:36
 * @Author: LChuang
 * @Description: 享元模式(结果型)
 *      池子技术
 *      用共享技术有效地支持大量细粒度的对象。
 *
 *          大大减少了对象的创建，降低了程序内存的占用，提高效率
 *     提高了系统的复杂度。需要分离出内部状态和外部状态，而外部状态具有固化特性，不应该随着内部状态的改变而改变
 *     抽象出来共享元
 *     池技术: 连接池, 线程池...
 *
 *     缺点：享元模式使逻辑变得更加复杂，需要将享元对象分出内部状态和外部状态。
 *          并且为了使对象可以共享，外部状态在很多情况下是必须有的，比如围棋的位置。当读取外部状态时明显会增加运行时间。
 */
public class Client {

    /**
     *优点
     *  享元模式 可以极大减少内存中对象的数量，使得相同对象或相似对象在内存中只保存一份，降低内存占用，增强程序的性能；
     *  享元模式 的外部状态相对独立，而且不会影响其内部状态，从而使得享元对象可以在不同的环境中被共享；
     *
     * 缺点
     *  享元模式 使得系统更加复杂，需要分离出内部状态和外部状态，这使得程序的逻辑复杂化；
     *  为了使对象可以共享，享元模式 需要将享元对象的状态外部化，而且外部状态必须具备固化特性，不应该随内部状态改变而改变，否则会导致系统的逻辑混乱；
     */
    /**
     * Flyweight: 抽象享元角色：享元对象抽象基类或者接口，同时定义出对象的外部状态和内部状态的接口或实现；
     * ConcreteFlyweight: 具体享元角色：实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关，不能出现会有一个操作改变内部状态，同时修改了外部状态；
     * FlyweightFactory: 享元工厂：负责管理享元对象池和创建享元对象；
     */
    public static void main(String[] args) {
        Flyweight unsharedFlyweight = new UnsharedConcreteFlyweight("b");
        unsharedFlyweight.operate("x");

        Flyweight flyweight = FlyweightFactory.getFlyweight("a");
        flyweight.operate("a");
    }
}
